/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../macro/head.h"
#include "../impl/head.h"
#include "core.h"
#include "log.h"

namespace xos_container
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 

    static xos_log::i_log_file * file_ptr = 0;
    static xos_log::i_logger * debug_ptr = 0;
    static xos_log::i_logger * cmd_ptr = 0;
    static xos_log::i_log_mgr * log_ptr = 0;

    static xos::i_dynamic * xos_module = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 

    log::log()
    {
    }

    log::~log()
    {
        term();
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

	xos_log::i_log_file * log::log_file()
	{
		return file_ptr;
	}

	xos_log::i_log_mgr * log::get()
	{
		return log_ptr;
	}

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 

    int log::init()
    {
        int ret = 0;

        xos_log::f_create fun = 0;

        if( 0 == ret )
        {
            xos_module = core::get()->dynamic();
        }

        if( 0 == ret )
        {
            ret = xos_module->load_and_get( ( void** )&fun, 
                core::get()->exe_path(),
                "xos_log",
                "create" );
        }

        if( 0 == ret )
        {
            ret = fun( mgr::container(), &log_ptr);
        }

        // 
        // 添加文件方式日志输出
        // 
        if( 0 == ret )
        {
            file_ptr = get()->file();
            if( !file_ptr )
            {
                ret = 1;
            }
            else
            {
                file_ptr->set_log_file_path( core::get()->exe_path() );
                log_ptr->add_logger( file_ptr );
            }
        }

        // 
        // 添加系统日志输出方式
        // 
        if( 0 == ret )
        {
            debug_ptr = get()->debug();
            if( !debug_ptr )
            {
                ret = 1;
            }
            else
            {
                log_ptr->add_logger( debug_ptr );
            }
        }

        // 
        // 添加cmd日志输出方式
        // 
        if( 0 == ret )
        {
            cmd_ptr = get()->cmd();
            if( !cmd_ptr )
            {
                ret = 1;
            }
            else
            {
                log_ptr->add_logger( cmd_ptr );
            }
        }

        return ret;
    }

    int log::term()
    {
        int ret = 0;

        xos_stl::release_interface( log_ptr );
        xos_stl::release_interface( file_ptr );
        xos_stl::release_interface( debug_ptr );
        xos_stl::release_interface( cmd_ptr );

        xos_stl::release_interface( xos_module );

        return ret;
    }

} // xos_container
